package com.eastfair.auth.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.eastfair.annotation.database.mybatis.auth.DataScope;
import com.eastfair.auth.dto.*;
import com.eastfair.auth.entity.Organization;
import com.eastfair.auth.vo.OrganizationVo;
import com.eastfair.auth.vo.RoleVo;
import com.eastfair.auth.vo.UserAccountVo;
import com.eastfair.boot.request.PageParams;
import com.eastfair.boot.service.SuperCacheService;
import com.eastfair.auth.entity.UserAccount;
import com.eastfair.constant.BusinessConstant;
import com.eastfair.core.base.R;
import com.eastfair.projectcore.vo.MenuVO;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestBody;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * <p>
 * 业务接口
 * 用户账户信息
 * </p>
 *
 * @author ligang
 * @date 2021-07-13
 */
public interface UserAccountService extends SuperCacheService<UserAccount> {
    /**
     * 查询用户信息
     *
     * @param userAccount 用户实体
     * @return
     */
    UserAccount getUser(UserAccount userAccount);

    /**
     * 注册
     *
     * @param userAccountDto 用户添加实体
     * @return
     */
    R<UserAccountVo> register(UserAccountDto userAccountDto);

    /**
     * 查询用户是否存在
     *
     * @param userAccountDto 用户添加实体
     * @return
     */
    List<UserAccount> queryUserOfregister(UserAccountDto userAccountDto);


    /**
     * 用户加入到子系统
     *
     * @param userId 用户ID
     * @return
     */
    R<UserAccountVo> addSubSystemUser(Long userId);

    /**
     * 用户剔除出子系统
     *
     * @param userId 用户ID
     * @return
     */
    R<UserAccountVo> removeSubSystemUser(Long userId);


    /**
     * 组装数据
     *
     * @param userAccount
     * @param isAdd
     * @return
     */
    UserAccount assembleSubSystem(UserAccount userAccount, int isAdd);

    UserAccount assembleTeam(UserAccount userAccount);

    /**
     * 获取团队id
     *
     * @param userAccount
     * @return
     */
    Long queryTeamId(UserAccount userAccount);

    /**
     * 注册公司员工
     *
     * @param userAccountDto 用户添加实体
     * @return
     */
    R<UserAccountVo> registerOfCompany(UserAccountDto userAccountDto);


    /**
     * 登录
     *
     * @param userAccountDto 用户实体
     * @return
     */
    R<UserAccountVo> login(UserAccountDto userAccountDto);


    /**
     * 手机号登录
     *
     * @param userAccountDto 用户实体
     * @return
     */
    R<UserAccountVo> loginOfMobile(UserAccountDto userAccountDto);


    /**
     * 邮箱登录
     *
     * @return
     */
    R<UserAccountVo> loginOfEmail(UserAccountDto userAccountDto);

    UserAccountVo assemblyUserAccount(UserAccount resultUserAccount, UserAccountDto userAccountDto);

    /**
     * 登出
     *
     * @param userId 用户id
     * @return
     */
    R loginOut(Long userId);

    /**
     * 修改密码
     *
     * @param userUpdPassParam 修改密码实体
     * @return
     */
    R<Boolean> updPassword(UserUpdPassParam userUpdPassParam);


    /**
     * 找回密码
     *
     * @param userUpdPassParam 修改密码实体
     * @return
     */
    R<Boolean> updPasswordOfCode(UserUpdPassParam userUpdPassParam);


    /**
     * 设置密码
     *
     * @param userUpdPassParam 密码实体
     * @return
     */
    R<Boolean> setPassword(UserUpdPassParam userUpdPassParam);

    /**
     * 重置密码
     *
     * @param userId 用户id
     * @return
     */
    R<Boolean> initPassword(Long userId);

    /**
     * 成为展商，观众
     *
     * @param userAccountDto
     * @return
     */
    R<UserAccountVo> initRole(UserAccountDto userAccountDto);


    /**
     * 查询用户信息
     *
     * @param userIds 用户id集合
     * @return
     */
    R<List<UserAccountVo>> findByIds(List<Long> userIds);

    /**
     * 查询用户信息
     *
     * @param userId 用户id
     * @return
     */
    R<UserAccountVo> findById(Long userId);


//    /**
//     * 查询用户角色
//     * @param userId
//     * @return
//     */
//    List<UserAccount> findRoleOfUserId(Long userId);

    /**
     * list查询用户信息
     *
     * @param userAccount 用户实体
     * @param ids         用户id集合
     * @return
     */
    List<UserAccount> listOfUserAccount(UserAccount userAccount, List<Long> ids);

    /**
     * list查询用户信息
     *
     * @param userAccount 用户实体
     * @param ids         用户id集合
     * @return
     */
    List<UserAccountVo> listOfUserAccountVo(UserAccount userAccount, List<Long> ids);

    /**
     * 查询用户所有角色和菜单
     *
     * @param userId 用户id
     * @return
     */
    UserAccountVo findOrgRoleOfUserId(Long userId);


    /**
     * 校验角色菜单是否超出本身的事件范围
     *
     * @param userId  用户id
     * @param menuIds 菜单id集合
     * @return
     */
    R verifyMenu(Long userId, List<Long> menuIds);


    /**
     * 逻辑删除 sharding
     *
     * @param ids
     * @return
     */
    R removeByIds(List<Long> ids);

    /**
     * 修改用户
     *
     * @param userAccountDto
     * @return
     */
    R<Boolean> updateById(UserAccountDto userAccountDto);


    /**
     * 给其他项目创建管理员
     *
     * @param userAccountDto 用户添加实体
     * @return
     */
    R<UserAccountVo> addAdminUser(UserAccountDto userAccountDto);


    /**
     * 密码校验
     *
     * @param password      明文密码
     * @param storePassword 数据库的储存密码
     * @return
     */
    boolean isValidPassword(String password, String storePassword);


    /**
     * 全库查询用户信息
     *
     * @param userAccountDto
     * @return
     */
    List<UserAccount> getUserByNameAllDb(UserAccountDto userAccountDto);


    /**
     * 根据邮箱和手机号查询用户信息
     *
     * @param userAccountDto 用户实体
     * @return
     */
    List<UserAccount> listOfPhoneOrEmail(UserAccountDto userAccountDto);

    /**
     * 分页查询
     *
     * @param params
     * @return
     */
    IPage<UserAccountVo> pageVo(PageParams<UserAccountDto> params);


    UserAccountVo doToVo(UserAccount userAccount);

    List<UserAccountVo> doToVos(List<UserAccount> userAccountList);


    /**
     * 查询组织下的用户
     *
     * @param organization
     * @return
     */
    OrganizationVo findAllUserOfOrg(Organization organization);

    /**
     * 查询组织下的负责人用户
     *
     * @param organization
     * @return
     */
    List<UserAccountVo> findAllLeaderUserOfOrg(Organization organization);

    /**
     * 项目是否是管理员项目
     *
     * @param projectId
     * @return
     */
    boolean verifyProjectIsAdmin(Long projectId);


    /**
     * 加载用户角色信息
     *
     * @param userAccountVo
     */
    void loadUserRole(UserAccountVo userAccountVo);


    /**
     * 查询用户角色信息
     *
     * @param userId
     */
    List<RoleVo> findRoleOfUserId(Long userId);


    /**
     * 查询用户部门信息
     *
     * @param userId
     */
    List<OrganizationVo> findOrgOfUserId(Long userId);

    /**
     * 查询用户所在组织
     *
     * @param userId
     * @return
     */
    List<Long> querySysteOrgIdsOfUserid(Long userId);

    void loadToken(UserAccountVo userAccountVo, UserAccountDto userAccountDto);


    /**
     * 用户是否在所在系统
     *
     * @param userAccount
     * @return
     */
    Integer isSubSystem(UserAccount userAccount);


    /**
     * 账户锁定
     *
     * @param userId
     * @return
     */
    Integer updUserEnable(Long userId);


    /**
     * 同步华为的账号数据
     *
     * @param huaWeiAccountDTO
     * @return
     */
    HuaWeiAccountDTO sycnAcctionOfCreate(HuaWeiAccountDTO huaWeiAccountDTO);

    /**
     * 同步华为的账号数据
     *
     * @param huaWeiAccountDTO
     * @return
     */
    HuaWeiAccountDTO sycnAcctionOfUpd(HuaWeiAccountDTO huaWeiAccountDTO);

    /**
     * 同步华为的账号数据
     *
     * @param huaWeiAccountDTO
     * @return
     */
    HuaWeiAccountDTO sycnAcctionOfDel(HuaWeiAccountDTO huaWeiAccountDTO);
}
